package com.wzp.fulfill.api.event.listener;

import com.wzp.fulfill.application.service.FulfillApplicationService;
import com.wzp.fulfill.application.command.OrderFulfillCommand;
import com.wzp.fulfill.application.command.dto.OrderDTO;
import com.wzp.fulfill.domain.event.OrderPayedEvent;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

/**
 * 订单已支付领域事件的消费者
 */
@Component
public class OrderPayedEventListener {

    // 具体的消费逻辑，就应该依赖你具体的MQ的技术来做一个实现就可以了
    // 正常他会自己有一个启动，启动了之后，在这里应该会去启动一个consumer，监听指定的mq里的topic
    // 在这里可以开发具体的mq消费监听的处理逻辑
    // 拿到了对应的消息之后，此时就可以交给我们对应的event handler来做一个处理就可以了

    @Autowired
    private FulfillApplicationService fulfillApplicationService;

    public void startConsume() {
        // 通过mq的消费技术，拿到一个一个的message，一般来说都是json格式的字符串
        // 应该在这里把message转化为一个一个的OrderPayedEvent领域事件
        OrderPayedEvent orderPayedEvent = new OrderPayedEvent(1100L);

        // 必须在这里把领域事件，转换为一个command，交给service去路由给对应的executor做一个处理
        Long orderId = orderPayedEvent.getOrderId();
        OrderDTO orderDTO = new OrderDTO(orderId);
        OrderFulfillCommand orderFulfillCommand = new OrderFulfillCommand(orderDTO);

        // 交给app层的应用服务逻辑，去推动命令的流程编排和执行
        fulfillApplicationService.executeOrderFulfill(orderFulfillCommand);

        // 应该处理一些MQ技术相关的细节，比如说offset的管理，是否要进行重试消费，以及其他的一些细节
    }

}
